<template>
  <a-spin :spinning="confirmLoading">
    <j-form-container :disabled="formDisabled">
      <!-- 主表单区域 -->
      <a-form-model ref="form" :model="model" :rules="validatorRules" slot="detail">
        <a-row>
          <a-col :span="8" >
            <a-form-model-item label="单据编号" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="billNo">
              <a-input v-model="model.billNo" placeholder="请输入单据编号" disabled></a-input>
            </a-form-model-item>
          </a-col>
          <a-col :span="8" >
            <a-form-model-item label="单据日期" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="billDate">
              <j-date placeholder="请选择单据日期" v-model="model.billDate" style="width: 100%" />
            </a-form-model-item>
          </a-col>
          <a-col :span="8" >
            <a-form-model-item label="库房" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="warehouseId">
              <j-search-select-tag  ref="warehouseSearch" v-model="model.warehouseId" dict="mdm_warehouse,warehouse_name,id"  />
            </a-form-model-item>
          </a-col>
          <a-col :span="8" >
            <a-form-model-item label="供应商" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="supplyId">
              <j-search-select-tag v-model="model.supplyId" dict="mdm_supply,supply_full_name,id"  />
            </a-form-model-item>
          </a-col>
          <a-col :span="8" >
            <a-form-model-item label="项目" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="projectId_dictText">
              <j-popup
                v-model="model.projectId_dictText"
                field="projectId"
                org-fields="id,project_name"
                dest-fields="projectId,projectId_dictText"
                code="quote_project_popup"
                :multi="false"
                @input="projectPopupCallback"
              />
            </a-form-model-item>
          </a-col>
          <a-col :span="8" >
            <a-form-model-item label="备注" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="remark">
              <a-textarea v-model="model.remark" rows="1" placeholder="请输入备注" />
            </a-form-model-item>
          </a-col>
        </a-row>
      </a-form-model>
    </j-form-container>
      <!-- 子表单区域 -->
    <a-tabs v-model="activeKey" @change="handleChangeTabs">
      <a-tab-pane tab="库存初始化明细" :key="refKeys[0]" :forceRender="true">
        <j-editable-table
          :ref="refKeys[0]"
          :loading="mmStockInitDetailTable.loading"
          :columns="mmStockInitDetailTable.columns"
          :dataSource="mmStockInitDetailTable.dataSource"
          :maxHeight="300"
          :disabled="formDisabled"
          :disabledRows="mmStockInitDetailTable.disabledRows"
          :rowNumber="true"
          :rowSelection="true"
          :actionButton="true"
          :actionAddButton="false"
          @added = "detailAdded"
          @valueChange = "qtyAndPriceChange">
          <div slot="buttonBefore" >
            <div class="action-button">
              <a-button type="primary" icon="plus" @click="chooseMaterial" :disabled="formDisabled">新增</a-button>
              <span class="gap"></span>
            </div>
          </div>
        </j-editable-table>
        <j-popup-onl-report ref="materialPopReport" code="mdm_popup_bom_material" multi="true" @ok="materialPopupCallback"/>
      </a-tab-pane>
    </a-tabs>
  </a-spin>
</template>

<script>

  import { getAction } from '@/api/manage'
  import { FormTypes,getRefPromise,VALIDATE_NO_PASSED } from '@/utils/JEditableTableUtil'
  import { JEditableTableModelMixin } from '@/mixins/JEditableTableModelMixin'
  import moment from "moment";
  import {initDictOptions} from "@/components/dict/JDictSelectUtil";

  export default {
    name: 'MmStockInitForm',
    mixins: [JEditableTableModelMixin],
    components: {
    },
    data() {
      return {
        labelCol: {
          xs: { span: 24 },
          sm: { span: 6 },
        },
        wrapperCol: {
          xs: { span: 24 },
          sm: { span: 16 },
        },
        labelCol2: {
          xs: { span: 24 },
          sm: { span: 3 },
        },
        wrapperCol2: {
          xs: { span: 24 },
          sm: { span: 20 },
        },
        model:{
          billDate: moment(new Date()).format('YYYY-MM-DD'),
        },
        warehouseUpdateCancel: false,
        // 新增时子表默认添加几行空数据
        addDefaultRowNum: 1,
        validatorRules: {
          warehouseId: [
            {required: true, message: '请输入库房!'}
          ],
           billDate: [
              { required: true, message: '请输入单据日期!'},
           ],
        },
        refKeys: ['mmStockInitDetail', ],
        tableKeys:['mmStockInitDetail', ],
        activeKey: 'mmStockInitDetail',
        // 库存初始化明细
        mmStockInitDetailTable: {
          loading: false,
          dataSource: [],
          disabledRows: {},
          columns: [
            {
              title: '物料描述',
              key: 'materialDesc',
              type: FormTypes.popup,
              popupCode:"mdm_popup_bom_material",
              orgFields: 'material_id,material_code,material_desc,material_unit_code,material_batch_flag',
              destFields: 'materialId,materialNo,materialDesc,unit,materialBatchFlag',
              width:"260px",
              placeholder: '请输入${title}',
              defaultValue:'',
              validateRules: [{ required: true, message: '${title}不能为空' }],
            },
            {
              title: '单位',
              key: 'unit',
              type: FormTypes.sel_search,
              dictCode:"mdm_unit,unit_name,unit_code",
              width:"110px",
              placeholder: '请输入${title}',
              defaultValue:'',
              disabled: true
            },
            {
              title: '数量',
              key: 'qty',
              type: FormTypes.inputNumber,
              width:"140px",
              placeholder: '请输入${title}',
              defaultValue:'0',
              statistics: true,
              scale: 2,
              validateRules: [
                { required: true, message: '${title}不能为空' },
                { pattern: /^(?!(0[0-9]{0,}$))[0-9]{1,}[.]{0,}[0-9]{0,}$/, message: '请输入大于零的数' },
              ],
            },
            {
              title: '含税单价',
              key: 'unitPrice',
              type: FormTypes.inputNumber,
              width:"200px",
              placeholder: '请输入${title}',
              defaultValue:'0',
            },
            {
              title: '含税金额',
              key: 'sumPrice',
              type: FormTypes.inputNumber,
              width:"200px",
              placeholder: '请输入${title}',
              defaultValue:'0',
              statistics: true,
              scale: 2,
            },
            {
              title: '批次',
              key: 'batchNo',
              type: FormTypes.input,
              width:"200px",
              placeholder: '请输入${title}',
              defaultValue:'',
              validateRules: [
                {
                  handler(type, value, row, column, callback, target){
                    if( type === 'blur' || type === 'getValues'){
                      let {values} = target.getValuesSync({ validate: false, rowIds: [row.id] });
                      let materialBatchFlag = values[0].materialBatchFlag;
                      if(materialBatchFlag === '1' && (value == null || value === '')){
                        callback(false, '${title}不能为空')
                        return
                      }else{
                        callback(true)
                      }
                    }else{
                      callback();
                    }
                  },
                }
              ],
            },
            {
              title: '库位',
              key: 'storageLocationId',
              type: FormTypes.sel_search,
              dictCode:"",
              width:"200px",
              placeholder: '请输入${title}',
              defaultValue:'',
              validateRules: [
                {
                  handler(type, value, row, column, callback, target){
                    if( type === 'blur' || type === 'getValues'){
                      let {values} = target.getValuesSync({ validate: false, rowIds: [row.id] });
                      let locationEnableFlag = values[0].locationEnableFlag;
                      if(locationEnableFlag === '1' && (value == null || value === '')){
                        callback(false, '${title}不能为空')
                        return
                      }else{
                        callback(true)
                      }
                    }else{
                      callback();
                    }
                  },
                }
              ],
            },
            {
              title: '备注',
              key: 'remark',
              type: FormTypes.input,
              width:"200px",
              placeholder: '请输入${title}',
              defaultValue:'',
            },
            {
              title: '行号',
              key: 'lineNo',
              type: FormTypes.inputNumber,
              width:"70px",
              placeholder: '请输入${title}',
              defaultValue:'',
              disabled: true,
            },
            {
              title: 'materialId',
              key: 'materialId',
              type:"hidden"
            },
            {
              title: 'materialNo',
              key: 'materialNo',
              type:"hidden"
            },
            {
              title: '库房',
              key: 'warehouseId',
              type: 'hidden',
            },
            {
              title: '批次管理',
              key: 'materialBatchFlag',
              type: 'hidden',
            },
            {
              title: '库位管理',
              key: 'locationEnableFlag',
              type: 'hidden',
              defaultValue: '0'
            },
            {
              title: '初始化标志',
              key: 'initFlag',
              type: 'hidden',
              defaultValue:'0',
            },
          ]
        },
        url: {
          add: "/mm/stockInit/add",
          edit: "/mm/stockInit/edit",
          queryById: "/mm/stockInit/queryById",
          genCode: "/mdm/codeRule/genCode",
          mmStockInitDetail: {
            list: '/mm/stockInit/queryMmStockInitDetailByMainId'
          },
          warehouse:{
            queryById: '/mdm/warehouse/queryById'
          }
        }
      }
    },
    props: {
      //表单禁用
      disabled: {
        type: Boolean,
        default: false,
        required: false
      }
    },
    computed: {
      formDisabled(){
        return this.disabled
      },
    },
    created () {
    },
    watch:{
      'model.warehouseId': {
        deep: true,
        handler(newVal, oldVal) {
          if(this.warehouseUpdateCancel){
            this.warehouseUpdateCancel = false;
            return;
          }
          let locationIdCol = this.mmStockInitDetailTable.columns.find(col => col.key === 'storageLocationId');
          let locationEnableFlagCol = this.mmStockInitDetailTable.columns.find(col => col.key === 'locationEnableFlag');
          let mmStockInitDetailTable = this.$refs[this.refKeys[0]];
          let {values} = mmStockInitDetailTable.getValuesAsync({validate: false})
          if(!newVal) {
            // 清除库房
            locationIdCol.options = [];
            locationEnableFlagCol.defaultValue = '0';
            values.forEach(item => {
              mmStockInitDetailTable.setValues([{rowKey: item.id, values: {locationEnableFlag: '0', storageLocationId: null}}]);
            })
            return;
          }else{
            // 获取库房信息
            getAction(this.url.warehouse.queryById,{id: newVal}).then(warehouseRes => {
              if (warehouseRes.success) {
                // 库位管理默认值设置
                let locationEnableFlag = warehouseRes.result.locationFlag || '0';
                locationEnableFlagCol.defaultValue = locationEnableFlag;
                // 库位下拉选项设置
                let dictCode = "mdm_storage_location,location_no,id" + encodeURIComponent(",enable_flag='1' and warehouse_id='" + newVal + "'")
                initDictOptions(dictCode).then(res => {
                  if (res.success && res.result.length > 0) {
                    locationIdCol.options = res.result;
                  } else {
                    locationIdCol.options = []
                  }
                }).then(() => {
                  // 表格数据更新
                  values.forEach(item => {
                    mmStockInitDetailTable.setValues([{rowKey: item.id, values: {locationEnableFlag: locationEnableFlag, storageLocationId: null}}]);
                  })
                  if(locationEnableFlag === '1' && locationIdCol.options.length == 0){
                    this.$message.error("库房未定义库位信息!")
                  }
                })
              } else {
                this.$message.error("未找到库房信息!")
                this.warehouseUpdateCancel = true;
                this.$refs['warehouseSearch'].handleChange(oldVal);
                return;
              }
            })
          }
        }
      },
    },
    methods: {
      addBefore(){
        this.genBillNo();
        this.mmStockInitDetailTable.dataSource=[]
      },
      genBillNo(){
        this.confirmLoading = true
        getAction(this.url.genCode, {codeType: '19'}).then(res => {
          if (res.success) {
            this.model.billNo = res.result;
          }
        }).finally(() => {
          this.confirmLoading = false
        })
      },
      getAllTable() {
        let values = this.tableKeys.map(key => getRefPromise(this, key))
        return Promise.all(values)
      },
      editBefore(record){
        record.id = record.pid;
      },
      /** 调用完edit()方法之后会自动调用此方法 */
      editAfter() {
        this.$nextTick(() => {
        })
        // 加载子表数据
        if (this.model.id) {
          let params = { id: this.model.id }
          this.requestSubTableData(this.url.mmStockInitDetail.list, params, this.mmStockInitDetailTable, this.setDisableRow)
        }
      },
      //校验所有一对一子表表单
      validateSubForm(allValues){
          return new Promise((resolve,reject)=>{
            Promise.all([
            ]).then(() => {
              resolve(allValues)
            }).catch(e => {
              if (e.error === VALIDATE_NO_PASSED) {
                // 如果有未通过表单验证的子表，就自动跳转到它所在的tab
                this.activeKey = e.index == null ? this.activeKey : this.refKeys[e.index]
              } else {
                console.error(e)
              }
            })
          })
      },
      /** 整理成formData */
      classifyIntoFormData(allValues) {
        let main = Object.assign(this.model, allValues.formValue)
        return {
          ...main, // 展开
          mmStockInitDetailList: allValues.tablesValue[0].values,
        }
      },
      validateError(msg){
        this.$message.error(msg)
      },
      detailAdded: function (obj) {
        let editTable = this.$refs[this.refKeys[0]];
        let lineNo = this.generateLineNo();
        editTable.setValues([{rowKey: obj.row.id, values:{lineNo: lineNo}}])
      },
      /** 生成行号 */
      generateLineNo(){
        let editTable = this.$refs[this.refKeys[0]];
        let rows = editTable.rows;
        let num = 10;
        if(rows.length > 1){
          let lastId = editTable.getCleanId(rows[rows.length-2].id)
          let {values} = editTable.getValuesSync({ validate: false, rowIds: [lastId] });
          num = Number(values[0].lineNo) + 10
        }
        return num
      },
      chooseMaterial(){
        this.$refs.materialPopReport.show();
      },
      materialPopupCallback(rows){
        if(rows && rows.length > 0){
          let mmStockInitDetailTable = this.$refs[this.refKeys[0]];
          let oldData = mmStockInitDetailTable.getValuesSync();
          let column = this.mmStockInitDetailTable.columns.find(col=>col.key === 'materialDesc')
          let orgFieldsArr = column.orgFields.split(',');
          let destFieldsArr = column.destFields.split(',');
          let addRow, addData
          for(let i =0; i< rows.length; i++){
            if(!(i === 0 && oldData && oldData.values && oldData.values.length===1 && !oldData.values[0].materialDesc)){
              mmStockInitDetailTable.add();
            }
            addRow = mmStockInitDetailTable.rows[mmStockInitDetailTable.rows.length - 1];
            // key转换
            for(let j=0; j<orgFieldsArr.length; j++){
              rows[i][destFieldsArr[j]] = rows[i][orgFieldsArr[j]];
              if(destFieldsArr[j] !== orgFieldsArr[j]){
                delete rows[i][orgFieldsArr[j]]
              }
            }
            addData = Object.assign({},rows[i])
            mmStockInitDetailTable.popupCallback(addData.materialDesc, addData, 'materialDesc'+addRow.id, addRow, column)
          }
        }
      },
      qtyAndPriceChange(parm) {
        if (parm && parm['column'] && parm['row'] && parm['target']) {
          let cols = ['qty', 'sumPrice', 'unitPrice'];
          let key = parm.column.key;
          if (cols.includes(key)) {
            let editableTable = parm['target'];
            // 重新计算当前行总金额
            if (key === cols[0] || key === cols[2]) {
              let unitPrice = parm.row[cols[2]] || 0;
              let qty = parm.row[cols[0]] || 0;
              let sumPrice = Math.round(unitPrice * qty * 100) / 100;
              editableTable.setValues([{rowKey: parm.row.id, values: {[cols[1]]: sumPrice}}]);
            }
            // 重新计算单价
            if (key === cols[1]) {
              let sumPrice = parm.row[cols[1]] || 0;
              let qty = parm.row[cols[0]] || 0;
              if (qty != 0) {
                let unitPrice = Math.round(sumPrice / qty * 100) / 100;
                editableTable.setValues([{rowKey: parm.row.id, values: {[cols[2]]: unitPrice}}]);
              }
            }
            // 重新计算统计列
            editableTable.recalcOneStatisticsColumn(cols[0]);
            editableTable.recalcOneStatisticsColumn(cols[1]);
          }
        }
      },
      setDisableRow(){
        let stockInitDetailData = this.mmStockInitDetailTable.dataSource;
        if(stockInitDetailData.length > 0){
          let ids = stockInitDetailData.filter(item => item.initFlag !== '0').map(item => item.id)
          this.mmStockInitDetailTable.disabledRows.id = ids
        }
      },
      projectPopupCallback(value,row){
        this.model = Object.assign(this.model, row);
      },
    }
  }
</script>

<style scoped>
.action-button {
  margin-bottom: 8px;
}
.gap {
  padding-left: 8px;
}
</style>